// utils/auth-helper.js - 授权检查工具函数
const userStore = require("../store/userStore.js");

/**
 * 检查用户登录状态，如果未登录则弹出授权窗口
 * @param {Object} options 配置选项
 * @param {string} options.title 授权弹窗标题
 * @param {string} options.content 授权弹窗内容
 * @param {Function} options.onSuccess 授权成功回调
 * @param {Function} options.onCancel 取消授权回调
 * @returns {Promise<boolean>} 是否已登录
 */
function checkAuthAndShowModal(options = {}) {
  const {
    title = "需要登录",
    content = "请先登录后再使用此功能",
    onSuccess = null,
    onCancel = null,
  } = options;

  return new Promise((resolve) => {
    // 检查是否已登录
    if (userStore.isLoggedIn()) {
      if (onSuccess) {
        onSuccess();
      }
      resolve(true);
      return;
    }

    // 未登录，显示授权弹窗
    wx.showModal({
      title,
      content,
      confirmText: "立即授权",
      cancelText: "取消",
      success: (res) => {
        if (res.confirm) {
          // 用户点击立即授权，执行登录
          performLogin()
            .then(() => {
              if (onSuccess) {
                onSuccess();
              }
              resolve(true);
            })
            .catch((error) => {
              console.error("登录失败:", error);
              wx.showToast({
                title: "登录失败，请重试",
                icon: "none",
              });
              resolve(false);
            });
        } else {
          // 用户取消授权
          if (onCancel) {
            onCancel();
          }
          resolve(false);
        }
      },
      fail: () => {
        if (onCancel) {
          onCancel();
        }
        resolve(false);
      },
    });
  });
}

/**
 * 检查授权状态并阻止未授权跳转
 * @param {Object} options 配置选项
 * @param {string} options.title 授权弹窗标题
 * @param {string} options.content 授权弹窗内容
 * @param {string} options.targetUrl 目标页面URL
 * @param {string} options.redirectUrl 取消授权后的跳转页面
 * @returns {Promise<boolean>} 是否允许跳转
 */
function checkAuthBeforeNavigate(options = {}) {
  const {
    title = "需要登录",
    content = "请先登录后再使用此功能",
    targetUrl = "",
    redirectUrl = "/pages/index/index",
  } = options;

  return new Promise((resolve) => {
    // 检查是否已登录
    if (userStore.isLoggedIn()) {
      // 已登录，直接跳转到目标页面
      if (targetUrl) {
        wx.switchTab({ url: targetUrl });
      }
      resolve(true);
      return;
    }

    // 未登录，显示授权弹窗
    wx.showModal({
      title,
      content,
      confirmText: "立即授权",
      cancelText: "取消",
      success: (res) => {
        if (res.confirm) {
          // 用户点击立即授权，执行登录
          performLogin()
            .then(() => {
              // 登录成功后跳转到目标页面
              if (targetUrl) {
                wx.switchTab({ url: targetUrl });
              }
              resolve(true);
            })
            .catch((error) => {
              console.error("登录失败:", error);
              wx.showToast({
                title: "登录失败，请重试",
                icon: "none",
              });
              // 登录失败，跳转到首页
              wx.switchTab({
                url: redirectUrl,
              });
              resolve(false);
            });
        } else {
          // 用户取消授权，跳转到指定页面
          wx.switchTab({
            url: redirectUrl,
          });
          resolve(false);
        }
      },
      fail: () => {
        wx.switchTab({
          url: redirectUrl,
        });
        resolve(false);
      },
    });
  });
}

/**
 * 执行登录操作
 * @returns {Promise} 登录结果
 */
function performLogin() {
  return new Promise((resolve, reject) => {
    // 检查是否支持getUserProfile
    if (wx.getUserProfile) {
      wx.getUserProfile({
        desc: "用于完善会员资料",
        success: async (res) => {
          try {
            console.log("获取到用户信息:", res.userInfo);

            // 调用userStore的微信登录方法
            const loginResult = await userStore.wxLogin();
            console.log("登录成功:", loginResult);

            resolve(loginResult);
          } catch (error) {
            console.error("登录过程出错:", error);
            reject(error);
          }
        },
        fail: (err) => {
          console.error("获取用户信息失败:", err);
          reject(new Error("获取用户信息失败"));
        },
      });
    } else {
      // 兼容旧版本
      wx.getUserInfo({
        success: async (res) => {
          try {
            console.log("获取到用户信息:", res.userInfo);

            // 调用userStore的微信登录方法
            const loginResult = await userStore.wxLogin();
            console.log("登录成功:", loginResult);

            resolve(loginResult);
          } catch (error) {
            console.error("登录过程出错:", error);
            reject(error);
          }
        },
        fail: (err) => {
          console.error("获取用户信息失败:", err);
          reject(new Error("获取用户信息失败"));
        },
      });
    }
  });
}

/**
 * 页面授权检查混入
 * 可以在页面的onLoad或onShow中调用
 * @param {Object} page 页面实例
 * @param {Object} options 配置选项
 */
function pageAuthMixin(page, options = {}) {
  const {
    title = "需要登录",
    content = "请先登录后再使用此功能",
    redirectOnCancel = false,
    redirectUrl = "/pages/index/index",
  } = options;

  // 保存原始方法
  const originalOnLoad = page.onLoad || function () {};
  const originalOnShow = page.onShow || function () {};

  // 重写onLoad方法
  page.onLoad = function (options) {
    checkAuthAndShowModal({
      title,
      content,
      onSuccess: () => {
        originalOnLoad.call(this, options);
      },
      onCancel: () => {
        if (redirectOnCancel) {
          wx.switchTab({
            url: redirectUrl,
          });
        }
      },
    });
  };

  // 重写onShow方法
  page.onShow = function () {
    checkAuthAndShowModal({
      title,
      content,
      onSuccess: () => {
        originalOnShow.call(this);
      },
      onCancel: () => {
        if (redirectOnCancel) {
          wx.switchTab({
            url: redirectUrl,
          });
        }
      },
    });
  };
}

module.exports = {
  checkAuthAndShowModal,
  checkAuthBeforeNavigate,
  performLogin,
  pageAuthMixin,
};
